import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;

/**
 * @author tanghailan
 * @create 2021年09月02日 20:16
 */
public class ImageUtil {

  public static void main(String[] args) {
    reSize(new File("C:\\Users\\Administrator\\Desktop\\7b9addca5b443c5f19dbda0cafae750 (1).jpg"),
        new File("C:\\Users\\Administrator\\Desktop\\123.jpg"),
        240, 320, true);
    //reSize(new File("F:\\temp\\1\\qrcode_258_258.jpg"),
    //    new File("F:\\temp\\2\\320_340.jpg"),
    //    320, 340, false);
  }

  /**
   * @param srcImg     原图片
   * @param destImg    目标位置
   * @param width      期望宽
   * @param height     期望高
   * @param equalScale 是否等比例缩放
   */
  public static void reSize(File srcImg, File destImg, int width,
      int height, boolean equalScale) {
    String type = getImageType(srcImg);
    if (type == null) {
      return;
    }
    if (width < 0 || height < 0) {
      return;
    }

    BufferedImage srcImage = null;
    try {
      srcImage = ImageIO.read(srcImg);
      System.out.println("srcImg size=" + srcImage.getWidth() + "X" + srcImage.getHeight());
    } catch (IOException e) {
      e.printStackTrace();
      return;
    }
    if (srcImage != null) {
      // targetW，targetH分别表示目标长和宽
      BufferedImage target = null;
      double sx = (double) width / srcImage.getWidth();
      double sy = (double) height / srcImage.getHeight();
      // 等比缩放
      if (equalScale) {
        if (sx > sy) {
          sx = sy;
          width = (int) (sx * srcImage.getWidth());
        } else {
          sy = sx;
          height = (int) (sy * srcImage.getHeight());
        }
      }
      System.out.println("destImg size=" + width + "X" + height);
      ColorModel cm = srcImage.getColorModel();
      WritableRaster raster = cm.createCompatibleWritableRaster(width, height);
      boolean alphaPremultiplied = cm.isAlphaPremultiplied();

      target = new BufferedImage(cm, raster, alphaPremultiplied, null);
      Graphics2D g = target.createGraphics();
      // smoother than exlax:
      g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
      g.drawRenderedImage(srcImage, AffineTransform.getScaleInstance(sx, sy));
      g.dispose();
      // 将转换后的图片保存
      try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(target, type, baos);
        FileOutputStream fos = new FileOutputStream(destImg);
        fos.write(baos.toByteArray());
        fos.flush();
        fos.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * 获取文件后缀不带.
   *
   * @param file 文件后缀名
   * @return
   */
  private static String getImageType(File file) {
    if (file != null && file.exists() && file.isFile()) {
      String fileName = file.getName();
      int index = fileName.lastIndexOf(".");
      if (index != -1 && index < fileName.length() - 1) {
        return fileName.substring(index + 1);
      }
    }
    return null;
  }
}
